[Salesforce DX] Scratch Orgを使った開発フローをためしてみた
どうも!西村祐二@大阪です。
最近、オープンベータとして発表された「Salesforce DX」についていろいろ調べています。
その「Salesforce DX」では「Scratch Org」という開発環境が提供されました。
今回は「Scratch Org」を使って「Salesforce DX」で想定されている開発フローを試してみたいと思います。
Scratch Orgとは
こちらの公式ページに記載の文章を引用すると下記になります。
これは、Salesforce コードとメタデータのソース主導で、使い捨て可能なデプロイメントです。 scratch org は完全に構成可能で、開発者は異なるエディションをさまざまな機能とプリファレンスでエミュレートできるため、開発プロセスにおける開発者の生産性とコラボレーションの促進に重要な役割を果たします。 また、自動化されたテストや包括的な継続統合スイートの実装の一部として使用することもできます。
実際に触ってみた印象はDockerコンテナ的な印象をうけました。
すぐにクローン環境ができるので使い勝手がよいです。
さっそく、「Scratch Org」を使ってみましょう!
開発の主な流れ
基本となる主な開発のフローは下記となります。
- ローカルプロジェクト作成
- Scratch Org作成
- ローカルでプログラミング or GUIからScratch Org更新
- ローカルプロジェクトとScratch Orgを同期
- 手順3,4を繰り返す
- テスト
- 実環境へデプロイ
事前準備
下記リンクを参考にこちらをご準備ください。
・DevHubが有効なSalesforce環境
・Salesforce cli
環境
mac : macOS Sierra 10.12.5
Salesforce cli : sfdx-cli/5.7.6-d42cf65 (darwin-amd64) go1.7.3 sfdxstable
Salesforce : v40
プロジェクトの作成
「Salesforce DX」で開発をはじめるときは
まず、ローカルにプロジェクトを作成します。
下記コマンドを打つと雛形ファイルが作成されます。
$ sfdx force:project:create -n testdx target dir = /Users/nishimura.yuji/study/salesforcedx create testdx/sfdx-project.json create testdx/README.md create testdx/config/project-scratch-def.json
このファイル群をGithubなどのVCSで管理し開発状況を共有したりできます。
Scratch Orgの作成
次にプロジェクトと紐付けする「Scratch Org」を作成します。
エイリアス名をtestscratchとして、先程作成したプロジェクト内にある
コンフィグファイルを指定し作成します。
$ sfdx force:org:create -s -f config/project-scratch-def.json -a testscratch Successfully created scratch org: 00YY000000XXXXXXX, username:xxxxxxxxxx@yyyyyyyyy.net
-s
オプションは作成するScratch Orgをデフォルトとして設定します。
下記コマンドにて、現在のDevHubやScratch Orgを確認できます。
$ sfdx force:org:list === Organizations ALIAS USERNAME ORG ID CONNECTED STATUS ─── ────────── ────────────────────────────────────────── ────────────────── ──────────────── (D) DevHub xxxxxxxxxx@yyyyyyyyyyy.jp 00xxx000000xxxxxxx Connected ALIAS SCRATCH ORG NAME USERNAME ORG ID EXPIRATION DATE ─── ───────────── ────────────────────── ──────────────────────────────────────────── ────────────────── ─────────────── (U) testscratch xxxxxxxxxxxxxx Company xxxxxxxxxxxxxxxxx@nxxxxxxxxxxxxxxx_xxxxx.net 00xx000000xxxxxxxx 2017-07-14
Scratch Orgにログイン
「Scratch Org」作成時-s
オプションを指定したので
特にScratch Orgのエイリアスを指定せずにログインできます。
$ sfdx force:org:open or $ sfdx force:org:open -u testscratch
コマンド実行後はブラウザが開き
いつもと変わらないSalesforceの画面に来ているかと思います。
違う所としてはURLが「Scratch Org」用のユニークなアドレスになっているぐらいです。
カスタムオブジェクトを作ってみる
作成した「Scratch Org」にログインできたら、その環境でカスタムオブジェクトを作成してみましょう。
ここでは、取引先の情報や取引先を登録する際に「AWSの利用費」の項目を追加したいと想定します。
下記が項目を追加する手順です。
- SalesforceのGUI上に移動します。
- クイック検索欄から検索し「オブジェクトマネージャ」を選択します。
- 取引先をクリックします。
- 「項目とリレーション」セクションで、「新規」をクリックします。
- 「数値」を選択し、「次へ」をクリックします 。
- 項目の表示ラベル:AWS利用費,桁数:18,小数点の位置:0,項目名:AWS を入力し、「次へ」をクリックします。
- 「次へ」をクリックして「標準ユーザー」のみ選択します。
- 「次へ」をクリックし、その後、保存します。
次に、新しく作成されたAWS利用費欄へのフィールドレベルのアクセスを制御する権限セットを定義します。
- 「クイック検索」から「権限セット」を選択します。
- 新規をクリックします。
- 「ラベル」には、「AWS」を入力します。
- 「保存」をクリックします。
- 「アプリケーション」の「オブジェクトの設定」をクリックします。
- 取引先をクリックします。
- 編集をクリックします。
- 「AWS利用費」で、「参照アクセス権」「編集アクセス権」を選択します。
- 「保存」をクリックします。
次に、この権限セットをユーザに割り当てましょう。CLIで次のコマンドを実行します。
$ sfdx force:user:permset:assign -n AWS Permission Set successfully assigned
GUIでの変更箇所をローカルプロジェクトにpull
GUIで行ったScratch Orgの変更をローカルプロジェクトに同期させます。
$ sfdx force:source:pull STATE FULL NAME TYPE PROJECT PATH ─────── ────────────────────────────────────── ───────────── ───────────────────────────────────────────────────────────────────────────────────── Changed Account CustomObject force-app/main/default/objects/Account.object-meta.xml Add Account-Account Layout Layout force-app/main/default/layouts/Account-Account Layout.layout-meta.xml Add Account-Account %28Sales%29 Layout Layout force-app/main/default/layouts/Account-Account %28Sales%29 Layout.layout-meta.xml Add Account-Account %28Support%29 Layout Layout force-app/main/default/layouts/Account-Account %28Support%29 Layout.layout-meta.xml Add Account-Account %28Marketing%29 Layout Layout force-app/main/default/layouts/Account-Account %28Marketing%29 Layout.layout-meta.xml Add AWS PermissionSet force-app/main/default/permissionsets/AWS.permissionset-meta.xml
上記のように変更箇所のメタデータがファイルとしてダウンロードされます。
ベストプラクティスとしてはローカルのプロジェクトに持ってきたソースをGithubなどのVCSにコミットするのがいいでしょう。Scratch Orgは一時的な環境なので、ローカルに保存した作業のバックアップが常に必要です。
サンプルデータ作成
Scratch OrgのGUI画面に戻り、「アプリランチャー」をクリックして「取引先」を選択し 、「新規」をクリックします。
下記画像のように、「取引先名:hoge、AWS利用費:10000」としてサンプルデータを作成します。
※取引先を追加する際に作成したAWS利用費の項目がない場合は
ブラウザをリロードして再度確認してみてください。
それでも表示されない場合はページレイアウトを確認してみてください。
CLIからSalesforceに登録されている情報を確認
下記コマンドのようにcliからクエリーをなげ情報を取得することができます。
先程GUIより追加した情報もしっかり取得できていることがわかります。
sfdx force:data:soql:query -q "SELECT AWS__c, Name FROM Account" -u testscratch AWS__C NAME ────── ─────────────────────────────────── 10000 hoge null Edge Communications null Burlington Textiles Corp of America null Pyramid Construction Inc. null Dickenson plc null Grand Hotels & Resorts Ltd null United Oil & Gas Corp. null Express Logistics and Transport null University of Arizona null United Oil & Gas, UK null United Oil & Gas, Singapore null GenePoint null sForce Total number of records retrieved: 13.
サンプルデータをエクスポート
Salesforce DXには、Scratch Orgから簡単にデータを取得してローカルプロジェクトに取り込むコマンドが用意されています。そのデータをVCSにコミットすることができます。そうすれば、他の開発者が新しいScratch Orgを起動したときにロードすることができます。
エクスポートしたファイルの保存先ディレクトリ作成 $ mkdir data エクスポート $ sfdx force:data:tree:export -q "SELECT Name, AWS__c FROM Account WHERE AWS__c != NULL" -d ./data Wrote 1 records to data/Account.json
エクスポートしたファイルを確認する。
$ data/Account.json { "records": [ { "attributes": { "type": "Account", "referenceId": "AccountRef1" }, "Name": "hoge", "AWS__c": 10000 } ] }
テスト:動作確認
大規模な開発になってくると実環境へデプロイするときと同じ条件にするために新しいScratch Orgを作成し、今まで作成したプログラムをプッシュし動作確認するのがよいでしょう。
テスト用のScratch Org「checkorg」を作成します。
$ sfdx force:org:create -f config/project-scratch-def.json -a checkorg Successfully created scratch org: 00xXXX000000XXXXX, username: xxxxxxxx@xxxxxx.net
ローカルプロジェクトを作成した「checkorg」にプッシュします。
$ sfdx force:source:push -u checkorg STATE FULL NAME TYPE PROJECT PATH ───── ────────────────────────────────────── ───────────── ────────────────────────────────────────────────────────────────────────────────────────────── Add Account-Account %28Marketing%29 Layout Layout force-app/main/default/layouts/Account-Account %28Marketing%29 Layout.layout-meta.xml Add Account-Account %28Sales%29 Layout Layout force-app/main/default/layouts/Account-Account %28Sales%29 Layout.layout-meta.xml Add Account-Account %28Support%29 Layout Layout force-app/main/default/layouts/Account-Account %28Support%29 Layout.layout-meta.xml Add Account-Account Layout Layout force-app/main/default/layouts/Account-Account Layout.layout-meta.xml Add Account CustomObject force-app/main/default/objects/Account/Account.object-meta.xml Add Account.AWS__c CustomField force-app/main/default/objects/Account/fields/AWS__c.field-meta.xml Add Account.AccountNumber CustomField force-app/main/default/objects/Account/fields/AccountNumber.field-meta.xml Add Account.AccountSource CustomField force-app/main/default/objects/Account/fields/AccountSource.field-meta.xml . . .
権限を付与します。
$ sfdx force:user:permset:assign -n AWS -u checkorg Permission Set successfully assigned
サンプルデータをインポートします。
$ sfdx force:data:tree:import --sobjecttreefiles data/Account.json -u checkorg === Import Results REFERENCE ID TYPE ID ──────────── ─────── ────────────────── AccountRef1 Account 0010m00000610GRAAY
「checkorg」にログインして動作確認します。
$ sfdx force:org:open -u checkorg
Scrartch Org以外の環境にデプロイ
メタデータ変換
Scrartch Org環境ではメタデータを小さなファイルに分割して管理していますが、
通常はひとつのファイルに保存されています。
そのため、Scratch Org以外の環境にデプロイする場合は
メタデータを変換する必要があります。
ソースをMetadata APIで使用できる形式に変換します。
ディレクトリ作成 $ mkdir mdapioutput $ sfdx force:source:convert -d mdapioutput Source was successfully converted to metadata api format and written to the location: /Users/nishimura.yuji/study/salesforcedx/testdx/mdapioutput
デプロイ
Scratch Orgでない通常のSalesforce環境にデプロイします。
デプロイ先はDevHubとします。
下記コマンドより、現在の状況を確認できます。
また、デプロイ内容にLightningコンポーネントが含まれている場合は
下記リンクを参考にドメイン設定を行っておく必要があります。
環境確認 $ sfdx force:org:list
DevHubにデプロイします。
$ sfdx force:mdapi:deploy -d mdapioutput/ -u DevHub -w 100 sfdx force:mdapi:deploy -d mdapioutput/ -u DevHub -w 100 7910 bytes written to /var/folders/cv/xxxxxxxxxxxxxxxxxxxxx/T/mdapioutput.zip using 62.311ms Deploying /var/folders/cv/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/T/mdapioutput.zip... === Status Status: InProgress jobid: xxxxxxxxxxxxxxx Component errors: 0 Components deployed: 0 Components total: 7 Tests errors: 0 Tests completed: 0 Tests total: 0 Check only: false Deployment finished in 1000ms === Result Status: Succeeded jobid: xxxxxxxxxxxxxxxxxxxxxxx Completed: 2017-07-08T02:42:56.000Z Component errors: 0 Components deployed: 3 Components total: 3 Tests errors: 0 Tests completed: 0 Tests total: 0 Check only: false
※デプロイが上手くいかない場合は変換したメタデータ内にある
package.xmlやobjectsディレクトリ内にあるファイルを更新した箇所のみに修正すると
うまくいくかもしれません。
ユーザに権限を付与します。
$ sfdx force:user:permset:assign -n AWS -u DevHub Permission Set successfully assigned
ログインしデプロイができているか確認します。
$ sfdx force:org:open -u DevHub
さいごに
いかがだったでしょうか。
Scratch OrgはGUIでしかできないことはGUIで行い
ローカルとの差分をpullすることでプロジェクトフォルダに
メタデータがダウンロードされ同期がとれる仕組みとなっておりかなり楽だなと感じました。
しかし、Scratch Orgで作成したプログラムを
Scratch Org以外の環境にデプロイするときは少し手間がかかるため
スクリプトをかいて自動化しておくのがよいかもしれません。